#ifndef __ring_buf_h__
#define __ring_buf_h__

#ifdef __cplusplus
extern "C" {
#endif

#include <stdint.h>

/*
 * ou == in的时候ring buf是空的
 * 每次读数据的时候直接读ou的数据，读完后ou++
 * 写的时候直接往in处写数据，写完后in++
 */
typedef struct ring_buf
{
    size_t vol;
    size_t in;
    size_t ou;
    uint8_t *buf;
    int full;
} ring_buf;

/*
 * 初始化一个ring buf
 */
void ring_buf_init(ring_buf *ring, void* buf, size_t size);
void ring_buf_deinit(ring_buf *ring);

size_t ring_buf_size_vol(ring_buf *ring);
/*
 * 查询一个ring buf中有多少数据，单位为字节
 * retval:
 *  这个ringbuf中的数据量
 */
size_t ring_buf_size_data(ring_buf *ring);
/*
 * 为了防止buf被刚好写满，也为了对齐的问题
 * retval:
 *  ring buf中的空的数量，单位为字节
 */
size_t ring_buf_size_empt(ring_buf *ring);

size_t ring_buf_push(ring_buf *ring, const void* buf, size_t size);
size_t ring_buf_shift(ring_buf *ring, void* buf, size_t size);

#ifdef __cplusplus
}
#endif

#endif

